#ifndef BASESOUSSEL_H
#define BASESOUSSEL_H

#include "BaseDialog.h"

#include "StatusCode.h"

#include <vector>

class QButtonGroup;
class QGroupBox;
class QPushButton;
class QVBoxLayout;
class QHBoxLayout;

/**
 * Classe de base pour les sélections complexes : la première étape
 * est faite avec une classe dérivée de BaseMultSel, et ensuite on
 * fait ici la réelle sélection. Cette classe sert de base aux widgets
 * permettant la sélection des compétences diverses, compétences
 * martiales ainsi que les sorts. Cette classe est un QDialog modal :
 * elle s'affiche donc au dessus de la fenêtre courante.\n
 *
 * Comme il faut gérer des liste en plus de l'affichage, cette classe
 * possède un nouveau niveau de sortie : BaseDialog::gestionListe.\n
 *
 * Cette classe ne fait que créer une liste de QCheckBox, mais elle
 * est flexible sur les arguments qu'on lui donne lors de la
 * construction. Elle permet en outre d'étiquetter une partie des
 * éléments de la liste de noms comme déjà sélectionnés.
 *
 * @see BaseMultSel
 *
 * @author Johan "Solo" Luisier
 */
class BaseSousSel : public BaseDialog
{
  Q_OBJECT
 public:
  BaseSousSel(const QString& fenNom,const unsigned int& nbr,
	      const std::string* noms, const std::string& titre,
	      QWidget *parent = 0);
  BaseSousSel(const QString& fenNom, const unsigned int& nbr,
	      const std::vector<std::string>& noms,
	      const std::string& titre, QWidget *parent = 0);
  BaseSousSel(const QString& fenNom, const unsigned int& nbr,
	      const std::string* noms,
	      const std::vector<bool>& deja, const std::string& titre,
	      QWidget *parent = 0);
  BaseSousSel(const QString& fenNom, const unsigned int& nbr,
	      const std::vector<std::string>& noms,
	      const std::vector<bool>& deja, const std::string& titre,
	      QWidget *parent = 0);
  BaseSousSel(const BaseSousSel& sousSel);
  virtual ~BaseSousSel();
  virtual StatusCode selectionFaite(std::vector<unsigned int>& vec);
  void setExclusif(const bool& etat);
  static void setLevel(const DebugLevelType& level);
 protected:
  /**
   * Groupe des enfants, qui sont des QCheckBox.
   */
  QButtonGroup *groupe;
  /**
   * Boîte permettant la représentation graphique en groupe des
   * différent items.
   */
  QGroupBox *boite;
  /**
   * Nombre d'éléments dans la liste.
   */
  unsigned int dimension;
  /**
   * Niveau de sortie pour ce qui est gestion de liste.
   */
  static DebugLevelType gestionListe;
};

#endif // BASESOUSSEL_H
